<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.5"/>
<title>spi: xspi_atmel_flash_example.c File Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<script type="text/javascript">
  $(document).ready(initResizable);
  $(window).load(resizeHeight);
</script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
<link href="HTML_custom.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
 <tbody>
 <tr style="height: 56px;">
  <td id="projectlogo"><img alt="Logo" src="xlogo_bg.png"/></td>
  <td style="padding-left: 0.5em;">
   <div id="projectname">spi
   </div>
   <div id="projectbrief">Vitis Drivers API Documentation</div>
  </td>
 </tr>
 </tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.5 -->
  <div id="navrow1" class="tabs">
    <ul class="tablist">
      <li><a href="index.html"><span>Overview</span></a></li>
      <li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
      <li><a href="globals.html"><span>APIs</span></a></li>
      <li><a href="files.html"><span>File&#160;List</span></a></li>
      <li><a href="pages.html"><span>Examples</span></a></li>
    </ul>
  </div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
  <div id="nav-tree">
    <div id="nav-tree-contents">
      <div id="nav-sync" class="sync"></div>
    </div>
  </div>
  <div id="splitbar" style="-moz-user-select:none;" 
       class="ui-resizable-handle">
  </div>
</div>
<script type="text/javascript">
$(document).ready(function(){initNavTree('xspi__atmel__flash__example_8c.html','');});
</script>
<div id="doc-content">
<div class="header">
  <div class="summary">
<a href="#func-members">Functions</a>  </div>
  <div class="headertitle">
<div class="title">xspi_atmel_flash_example.c File Reference</div>  </div>
</div><!--header-->
<div class="contents">
<a name="details" id="details"></a><h2 class="groupheader">Overview</h2>
<div class="textblock"><p>This file contains a design example using the SPI driver (<a class="el" href="struct_x_spi.html" title="The XSpi driver instance data. ">XSpi</a>) and hardware device with an Atmel Serial Flash Device (AT45XX series). </p>
<p>This example erases the Page, writes to the Page, reads back from the Page and compares the data.</p>
<p>This example works for an Atmel AT45DB161D. The bytes per page (ATMEL_PAGE_SIZE) in this device is 528 bytes for default addressing mode and 512 bytes in Power-of-2 addressing mode. For further details of device refer to the Atmel Datasheet of AT45DB161D device.</p>
<p>The ATMEL_PAGE_SIZE constant need to be updated by the user according to the Device used.</p>
<p>The ATMEL_FLASH_TEST_ADDRESS constant need to be updated by the user according to the serial flash device used, there is no error checking done in the example for the address specified by the user.</p>
<p>This example also works with the In-System Flash(ISF) in the S3AN devices. The ATMEL_PAGE_SIZE and ATMEL_FLASH_TEST_ADDRESS need to be defined properly based on the device used. For further details of the ISF refer to the Spartan-3AN FPGA In-System Flash User Guide (UG333).</p>
<p>This example assumes that the underlying processor is MicroBlaze and default addressing mode is used in the Flash Device.</p>
<dl class="section note"><dt>Note</dt><dd></dd></dl>
<p>None.</p>
<pre>
MODIFICATION HISTORY:</pre><pre>Ver   Who  Date     Changes
</p>
<hr/>
<p>
1.00a sdn  02/26/08 First release
1.00a sdn  07/02/08 Changed the initialization so that the SPI
              Master works in Spi Mode 3 as the In-System Flash
              works only in Spi Mode 3
3.00a ktn  10/22/09 Converted all register accesses to 32 bit access.
              Updated to use the HAL APIs/macros. Replaced call to
              XSpi_Initialize API with XSpi_LookupConfig and
              XSpi_CfgInitialize.
4.2   ms   01/23/17 Added xil_printf statement in main function to
                    ensure that "Successfully ran" and "Failed" strings
                    are available in all examples. This is a fix for
                    CR-965028.
      ms   04/05/17 Modified Comment lines to follow doxygen rules.
4.11  sb   07/11/23 Added support for system device-tree flow.
</pre> </div><table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
Functions</h2></td></tr>
<tr class="memitem:aacdc7be0761bc23854d5f1b9c6dbe36a"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xspi__atmel__flash__example_8c.html#aacdc7be0761bc23854d5f1b9c6dbe36a">SpiHandler</a> (void *CallBackRef, u32 StatusEvent, unsigned int ByteCount)</td></tr>
<tr class="memdesc:aacdc7be0761bc23854d5f1b9c6dbe36a"><td class="mdescLeft">&#160;</td><td class="mdescRight">This function is the handler which performs processing for the SPI driver.  <a href="#aacdc7be0761bc23854d5f1b9c6dbe36a">More...</a><br/></td></tr>
<tr class="separator:aacdc7be0761bc23854d5f1b9c6dbe36a"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:af1f8ff70c5039fe5656c3d9476d3c671"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xspi__atmel__flash__example_8c.html#af1f8ff70c5039fe5656c3d9476d3c671">SpiAtmelFlashRead</a> (<a class="el" href="struct_x_spi.html">XSpi</a> *SpiPtr, u32 Address, u16 ByteCount)</td></tr>
<tr class="memdesc:af1f8ff70c5039fe5656c3d9476d3c671"><td class="mdescLeft">&#160;</td><td class="mdescRight">This function reads data from the Atmel Flash device connected to the SPI interface.  <a href="#af1f8ff70c5039fe5656c3d9476d3c671">More...</a><br/></td></tr>
<tr class="separator:af1f8ff70c5039fe5656c3d9476d3c671"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a6eb43fd87e3cff7189788dba94c3d595"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xspi__atmel__flash__example_8c.html#a6eb43fd87e3cff7189788dba94c3d595">SpiAtmelFlashWrite</a> (<a class="el" href="struct_x_spi.html">XSpi</a> *SpiPtr, u32 Address, u16 ByteCount)</td></tr>
<tr class="memdesc:a6eb43fd87e3cff7189788dba94c3d595"><td class="mdescLeft">&#160;</td><td class="mdescRight">This function writes to the Atmel Flash device connected to the SPI interface.  <a href="#a6eb43fd87e3cff7189788dba94c3d595">More...</a><br/></td></tr>
<tr class="separator:a6eb43fd87e3cff7189788dba94c3d595"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a0ed9e112534c36b485c016cc7e87371a"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xspi__atmel__flash__example_8c.html#a0ed9e112534c36b485c016cc7e87371a">SpiAtmelFlashPageErase</a> (<a class="el" href="struct_x_spi.html">XSpi</a> *SpiPtr, u32 Address)</td></tr>
<tr class="memdesc:a0ed9e112534c36b485c016cc7e87371a"><td class="mdescLeft">&#160;</td><td class="mdescRight">This function erases the contents of the specified Page in the Flash.  <a href="#a0ed9e112534c36b485c016cc7e87371a">More...</a><br/></td></tr>
<tr class="separator:a0ed9e112534c36b485c016cc7e87371a"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a840291bc02cba5474a4cb46a9b9566fe"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xspi__atmel__flash__example_8c.html#a840291bc02cba5474a4cb46a9b9566fe">main</a> (void)</td></tr>
<tr class="memdesc:a840291bc02cba5474a4cb46a9b9566fe"><td class="mdescLeft">&#160;</td><td class="mdescRight">Main function to execute the Atmel Flash example.  <a href="#a840291bc02cba5474a4cb46a9b9566fe">More...</a><br/></td></tr>
<tr class="separator:a840291bc02cba5474a4cb46a9b9566fe"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table>
<h2 class="groupheader">Function Documentation</h2>
<a class="anchor" id="a840291bc02cba5474a4cb46a9b9566fe"></a>
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">int main </td>
          <td>(</td>
          <td class="paramtype">void&#160;</td>
          <td class="paramname"></td><td>)</td>
          <td></td>
        </tr>
      </table>
</div><div class="memdoc">

<p>Main function to execute the Atmel Flash example. </p>
<dl class="section return"><dt>Returns</dt><dd>XST_SUCCESS if successful else XST_FAILURE.</dd></dl>
<dl class="section note"><dt>Note</dt><dd>None </dd></dl>

<p>References <a class="el" href="struct_x_spi___config.html#a495ec19a4ab441ea59a0e220f0728dd9">XSpi_Config::BaseAddress</a>, <a class="el" href="xspi__atmel__flash__example_8c.html#a0ed9e112534c36b485c016cc7e87371a">SpiAtmelFlashPageErase()</a>, <a class="el" href="xspi__atmel__flash__example_8c.html#af1f8ff70c5039fe5656c3d9476d3c671">SpiAtmelFlashRead()</a>, <a class="el" href="xspi__atmel__flash__example_8c.html#a6eb43fd87e3cff7189788dba94c3d595">SpiAtmelFlashWrite()</a>, <a class="el" href="xspi__atmel__flash__example_8c.html#aacdc7be0761bc23854d5f1b9c6dbe36a">SpiHandler()</a>, <a class="el" href="group__spi.html#gac2c043a14b04e38a61b1979ccaa8a200">XSP_MASTER_OPTION</a>, <a class="el" href="group__spi.html#ga858155b42d5a1da8efe06c9098e40b2d">XSpi_CfgInitialize()</a>, <a class="el" href="group__spi.html#gaf3863f11d27469d8797424319601c980">XSpi_InterruptHandler()</a>, <a class="el" href="group__spi.html#gac2c4a169e05ad6e040796ae86100fd5b">XSpi_LookupConfig()</a>, <a class="el" href="group__spi.html#ga67c2076b133a55b6f80343642a1ace41">XSpi_SetOptions()</a>, <a class="el" href="group__spi.html#ga162523a3e9b29f063701db303ac8cf17">XSpi_SetSlaveSelect()</a>, <a class="el" href="group__spi.html#gabc09f4d503de2a772e5079ac46fc62b6">XSpi_SetStatusHandler()</a>, and <a class="el" href="group__spi.html#ga87fdaad742a2669200c9b2617e5c86ea">XSpi_Start()</a>.</p>

</div>
</div>
<a class="anchor" id="a0ed9e112534c36b485c016cc7e87371a"></a>
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">int SpiAtmelFlashPageErase </td>
          <td>(</td>
          <td class="paramtype"><a class="el" href="struct_x_spi.html">XSpi</a> *&#160;</td>
          <td class="paramname"><em>SpiPtr</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">u32&#160;</td>
          <td class="paramname"><em>Address</em>&#160;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td>
        </tr>
      </table>
</div><div class="memdoc">

<p>This function erases the contents of the specified Page in the Flash. </p>
<dl class="params"><dt>Parameters</dt><dd>
  <table class="params">
    <tr><td class="paramname">SpiPtr</td><td>is a pointer to the SPI driver component to use. </td></tr>
    <tr><td class="paramname">Address</td><td>contains the address of the page to be erased.</td></tr>
  </table>
  </dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>XST_SUCCESS if successful else XST_FAILURE.</dd></dl>
<dl class="section note"><dt>Note</dt><dd>None. </dd></dl>

<p>References <a class="el" href="group__spi.html#ga4c44c082ef2d2b9cf4ba3db8bcebd954">XSpi_Transfer()</a>.</p>

<p>Referenced by <a class="el" href="xspi__atmel__flash__example_8c.html#a840291bc02cba5474a4cb46a9b9566fe">main()</a>.</p>

</div>
</div>
<a class="anchor" id="af1f8ff70c5039fe5656c3d9476d3c671"></a>
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">int SpiAtmelFlashRead </td>
          <td>(</td>
          <td class="paramtype"><a class="el" href="struct_x_spi.html">XSpi</a> *&#160;</td>
          <td class="paramname"><em>SpiPtr</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">u32&#160;</td>
          <td class="paramname"><em>Address</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">u16&#160;</td>
          <td class="paramname"><em>ByteCount</em>&#160;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td>
        </tr>
      </table>
</div><div class="memdoc">

<p>This function reads data from the Atmel Flash device connected to the SPI interface. </p>
<dl class="params"><dt>Parameters</dt><dd>
  <table class="params">
    <tr><td class="paramname">SpiPtr</td><td>is a pointer to the SPI driver component to use. </td></tr>
    <tr><td class="paramname">Address</td><td>is the address from which the data is to be read from the Flash. </td></tr>
    <tr><td class="paramname">ByteCount</td><td>is the number of bytes to read.</td></tr>
  </table>
  </dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>XST_SUCCESS if successful else XST_FAILURE.</dd></dl>
<dl class="section note"><dt>Note</dt><dd>None. </dd></dl>

<p>References <a class="el" href="group__spi.html#ga4c44c082ef2d2b9cf4ba3db8bcebd954">XSpi_Transfer()</a>.</p>

<p>Referenced by <a class="el" href="xspi__atmel__flash__example_8c.html#a840291bc02cba5474a4cb46a9b9566fe">main()</a>.</p>

</div>
</div>
<a class="anchor" id="a6eb43fd87e3cff7189788dba94c3d595"></a>
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">int SpiAtmelFlashWrite </td>
          <td>(</td>
          <td class="paramtype"><a class="el" href="struct_x_spi.html">XSpi</a> *&#160;</td>
          <td class="paramname"><em>SpiPtr</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">u32&#160;</td>
          <td class="paramname"><em>Address</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">u16&#160;</td>
          <td class="paramname"><em>ByteCount</em>&#160;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td>
        </tr>
      </table>
</div><div class="memdoc">

<p>This function writes to the Atmel Flash device connected to the SPI interface. </p>
<dl class="params"><dt>Parameters</dt><dd>
  <table class="params">
    <tr><td class="paramname">SpiPtr</td><td>is a pointer to the SPI driver component to use. </td></tr>
    <tr><td class="paramname">Address</td><td>is the address to which the data is written. </td></tr>
    <tr><td class="paramname">ByteCount</td><td>contains the number of bytes to write.</td></tr>
  </table>
  </dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>XST_SUCCESS if successful else XST_FAILURE.</dd></dl>
<dl class="section note"><dt>Note</dt><dd>None. </dd></dl>

<p>References <a class="el" href="group__spi.html#ga4c44c082ef2d2b9cf4ba3db8bcebd954">XSpi_Transfer()</a>.</p>

<p>Referenced by <a class="el" href="xspi__atmel__flash__example_8c.html#a840291bc02cba5474a4cb46a9b9566fe">main()</a>.</p>

</div>
</div>
<a class="anchor" id="aacdc7be0761bc23854d5f1b9c6dbe36a"></a>
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">void SpiHandler </td>
          <td>(</td>
          <td class="paramtype">void *&#160;</td>
          <td class="paramname"><em>CallBackRef</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">u32&#160;</td>
          <td class="paramname"><em>StatusEvent</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">unsigned int&#160;</td>
          <td class="paramname"><em>ByteCount</em>&#160;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td>
        </tr>
      </table>
</div><div class="memdoc">

<p>This function is the handler which performs processing for the SPI driver. </p>
<p>It is called from an interrupt context such that the amount of processing performed should be minimized. It is called when a transfer of SPI data completes or an error occurs.</p>
<p>This handler provides an example of how to handle SPI interrupts and is application specific.</p>
<dl class="params"><dt>Parameters</dt><dd>
  <table class="params">
    <tr><td class="paramname">CallBackRef</td><td>is the upper layer callback reference passed back when the callback function is invoked. </td></tr>
    <tr><td class="paramname">StatusEvent</td><td>is the event that just occurred. </td></tr>
    <tr><td class="paramname">ByteCount</td><td>is the number of bytes transferred up until the event occurred.</td></tr>
  </table>
  </dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>None.</dd></dl>
<dl class="section note"><dt>Note</dt><dd>None.</dd></dl>
<p>It is called from an interrupt context such that the amount of processing performed should be minimized. It is called when a transfer of SPI data completes or an error occurs.</p>
<p>This handler provides an example of how to handle SPI interrupts but is application specific.</p>
<dl class="params"><dt>Parameters</dt><dd>
  <table class="params">
    <tr><td class="paramname">CallBackRef</td><td>is a reference passed to the handler. </td></tr>
    <tr><td class="paramname">StatusEvent</td><td>is the status of the SPI . </td></tr>
    <tr><td class="paramname">ByteCount</td><td>is the number of bytes transferred.</td></tr>
  </table>
  </dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>None</dd></dl>
<dl class="section note"><dt>Note</dt><dd>None.</dd></dl>
<p>It is called from an interrupt context such that the amount of processing to be performed should be minimized. This handler provides an example of how to handle SPI interrupts but is application specific.</p>
<dl class="params"><dt>Parameters</dt><dd>
  <table class="params">
    <tr><td class="paramname">CallBackRef</td><td>is a reference passed to the handler. </td></tr>
    <tr><td class="paramname">StatusEvent</td><td>is the status of the SPI. </td></tr>
    <tr><td class="paramname">ByteCount</td><td>is the number of bytes transferred.</td></tr>
  </table>
  </dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>None.</dd></dl>
<dl class="section note"><dt>Note</dt><dd>None. </dd></dl>

<p>Referenced by <a class="el" href="xspi__atmel__flash__example_8c.html#a840291bc02cba5474a4cb46a9b9566fe">main()</a>.</p>

</div>
</div>
</div><!-- contents -->
</div><!-- doc-content -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
	<p class="footer">&copy; Copyright 2015-2022 Xilinx, Inc. All Rights Reserved.</p>
	<p class="footer">&copy; Copyright 2022-2023 Advanced Micro Devices, Inc. All Rights Reserved.</p>
</div>
</body>
</html>
